//遍历
arr = [10, 20, 30]
arr.a = function() {
    console.log(this);
    this.forEach(element => {

    });
    (item => {
        console.log(item)
    })


}
arr.a();



// 但是，如果我们给xiaoming绑定一个函数，就可以做更多的事情。比如，写个age()方法，返回xiaoming的年龄：
var a = {
    name: 'JavaScript',
    id: 007,
    brith: 2002,
    age: function() {
        var b = new Date().getFullYear();
        return b - this.brith
    }
}
console.log(a.age);

console.log(a.age());




// 在一个方法内部，this是一个特殊变量，它始终指向当前对象，也就是xiaoming这个变量。所以，this.birth可以拿到xiaoming的birth属性。

// 让我们拆开写：
function fc() {
    var x = new Date().getFullYear();
    return x - this.brith;
}

var a = {
    name: 'JavaScript',
    id: 007,
    brith: 2002,
    age: fc
}
console.log(a.age());

// 要指定函数的this指向哪个对象，可以用函数本身的apply方法，它接收两个参数，第一个参数就是需要绑定的this变量，第二个参数是Array，表示函数本身的参数。

// 用apply修复getAge()调用：

console.log(fc.apply(a, [])); //apply()把参数打包成Array再传入；
console.log(fc.call(a, [])); //call()把参数按顺序传入。

console.log(Math.max.apply(null, [3, 5, 4]));
console.log(Math.max.call(null, 3, 5, 4));




// 装饰器
// 利用apply()，我们还可以动态改变函数的行为。

// JavaScript的所有对象都是动态的，即使内置的函数，我们也可以重新指向新的函数。

// 现在假定我们想统计一下代码一共调用了多少次parseInt()，可以把所有的调用都找出来，然后手动加上count += 1，不过这样做太傻了。最佳方案是用我们自己的函数替换掉默认的parseInt()：

'use strict';

var count = 0;
var oldParseInt = parseInt; // 保存原函数

window.parseInt = function() {
    count += 1;
    return oldParseInt.apply(null, arguments); // 调用原函数
};
// 测试:
parseInt('10');
parseInt('20');
parseInt('30');
console.log('count = ' + count); // 3